/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package br.faesa.acervo.business.ejb;

import br.faesa.acervo.entity.Aluno;
import br.faesa.acervo.entity.Emprestimo;
import br.faesa.acervo.entity.Livro;
import br.faesa.acervo.exception.CreateReservaException;
import br.faesa.acervo.exception.PeriodoInvalidoException;
import br.faesa.acervo.util.DataUtil;
import java.util.Date;
import javax.ejb.EJB;
import javax.ejb.Remove;
import javax.ejb.Stateful;

/**
 *
 * @author Eric Rosetti Lessa
 */
@Stateful
public class ReservaService implements ReservaServiceRemote {
    
    private Long idLivro;
    
    private Long matricula;
    
    private Date dtEmprestimo;
    
    private Date dtDevolucao;
    
    @EJB
    private EmprestimoDAO emprestimoDAO;

    @EJB
    private AlunoDAO alunoDAO;
    
    public void validarPeriodoReserva() throws PeriodoInvalidoException{
        Livro livro = new Livro();
        livro.setId(idLivro);
        
        Long qtEmps = this.emprestimoDAO.countEmprestimosByIntervalo(dtEmprestimo, dtDevolucao, livro);
        
        if(qtEmps > 0){
            throw new PeriodoInvalidoException("Já existe reserva para o período informado!");
        }
    }

    @Remove
    public void salvar() throws CreateReservaException{
        
        if(DataUtil.compararDatasSemHora(this.dtEmprestimo, new Date()) < 0){
            throw new CreateReservaException("A Data da Reserva deve ser maior ou igual que a data atual");
        }
        
        if(DataUtil.compararDatasSemHora(this.dtDevolucao, this.dtEmprestimo) <= 0){
            throw new CreateReservaException("Data da devolução deve ser maior que a Data da Reserva");
        }
        
        this.validarPeriodoReserva();

        Emprestimo emprestimo = new Emprestimo();
        
        Aluno aluno = alunoDAO.findByMatricula(this.matricula);
        
        Livro livro = new Livro();
        livro.setId(idLivro);
        
        emprestimo.setAluno(aluno);
        emprestimo.setLivro(livro);
        emprestimo.setDtDevolucao(dtDevolucao);
        emprestimo.setDtEmprestimo(dtEmprestimo);
        
        this.emprestimoDAO.salvar(emprestimo);
    }
    
    public Long getIdLivro() {
        return idLivro;
    }

    public void setIdLivro(Long idLivro) {
        this.idLivro = idLivro;
    }

    public Long getMatricula() {
        return matricula;
    }

    public void setMatricula(Long matricula) {
        this.matricula = matricula;
    }


    public Date getDtEmprestimo() {
        return dtEmprestimo;
    }

    public void setDtEmprestimo(Date dtEmprestimo) {
        this.dtEmprestimo = dtEmprestimo;
    }

    public Date getDtDevolucao() {
        return dtDevolucao;
    }

    public void setDtDevolucao(Date dtDevolucao) {
        this.dtDevolucao = dtDevolucao;
    }

    public EmprestimoDAO getEmprestimoDAO() {
        return emprestimoDAO;
    }

    public void setEmprestimoDAO(EmprestimoDAO emprestimoDAO) {
        this.emprestimoDAO = emprestimoDAO;
    }
    

    
}
